home *** CD-ROM | disk | FTP | other *** search
/ HTBasic 9.3 / HTBasic 9.3.iso / LgcyPlus / disk2 / TICTACTO._ / TICTACTO.
Encoding:
Text File  |  2001-03-02  |  16.2 KB  |  500 lines

  1. 10    ! ************************************************************
  2. 20    ! Example: Tic-Tac-Toe
  3. 30    !
  4. 40    ! This example program plays tic-tac-toe.
  5. 50    ! It illustrates the use of STRING widgets with different fonts, and
  6. 60    ! shows how attribute arrays can be used. The PUSHBUTTON object
  7. 70    ! is used to initiate an action. Each of the squares is a pushbutton.
  8. 80    ! When a button is clicked it is given to a player and deactivated.
  9. 90    !
  10. 100   ! The arrays Attr_n$ and Attr are used to program six numeric attributes
  11. 110   ! at once. The arrays Attr_s$ and Attr_sv$ are used to program three
  12. 120   ! string attributes.
  13. 130   !
  14. 140   ! ************************************************************
  15. 150   !
  16. 160   DIM Attr_n$(5)[11],Attr_s$(2)[10],Attr(5),Attr_sv$(2)[10],Xo$(1)[1]
  17. 170   DIM Sel$(4)[1],Grid$(1)[10],Buttons$(2)[5]
  18. 180   DIM Xo(3,3)
  19. 190   Dims=4
  20. 200   Attr_n$(0)="X"
  21. 210   Attr_n$(1)="Y"
  22. 220   Attr_n$(2)="WIDTH"
  23. 230   Attr_n$(3)="HEIGHT"
  24. 240   Attr_n$(4)="RESIZABLE"
  25. 250   Attr_n$(5)="MAXIMIZABLE"
  26. 260   Attr(0)=100                    ! x position
  27. 270   Attr(1)=20                     ! y position
  28. 280   Attr(2)=50                     ! width
  29. 290   Attr(3)=50                     ! height
  30. 300   Attr(4)=0                      ! not resizable
  31. 310   Attr(5)=0                      ! not maximizable
  32. 320   Attr_s$(0)="FONT"
  33. 330   Attr_s$(1)="TITLE"
  34. 340   Attr_s$(2)="LABEL"
  35. 350   Attr_sv$(0)="20 BY 30"         ! A large font
  36. 360   Attr_sv$(1)=""                 ! Makes the title area disappear
  37. 370   Attr_sv$(2)=""                 ! Use a blank label to start
  38. 380   Sel$(0)="0"
  39. 390   Sel$(1)="1"
  40. 400   Sel$(2)="2"
  41. 410   Sel$(3)="3"
  42. 420   Sel$(4)="4"
  43. 430   Grid$(0)="3 BY 3"
  44. 440   Grid$(1)="4 BY 4"
  45. 450   Buttons$(0)="1"
  46. 460   Buttons$(1)="2"
  47. 470   Buttons$(2)="Quit"
  48. 480   DIALOG "QUESTION","How many players?",Button;SET ("DIALOG BUTTONS":Buttons$(*))
  49. 490   IF Button=2 THEN STOP
  50. 500   Players=Button+1
  51. 510   DIALOG "LIST","Select Playing Grid",Button;SET ("ITEMS":Grid$(*),"SELECTED ITEM":0),RETURN ("SELECTED ITEM":Grid)
  52. 520   Dims=3
  53. 530   IF Grid=1 THEN Dims=4
  54. 540   IF Button=1 THEN STOP
  55. 550   DIALOG "LIST","Select Level of Difficulty",Button;SET ("ITEMS":Sel$(*),"SELECTED ITEM":1),RETURN ("SELECTED ITEM":Level)
  56. 560   IF Button=1 THEN STOP
  57. 570   !
  58. 580   ! Nine pushbutton widgets are created in three rows and three columns.
  59. 590   ! The use of the attribute arrays allows all the widgets to be changed
  60. 600   ! easily and yet have them still be aligned.
  61. 610   !
  62. 620   ASSIGN @Box11 TO WIDGET "PUSHBUTTON";SET (Attr_n$(*):Attr(*),Attr_s$(*):Attr_sv$(*))
  63. 630   Attr(0)=Attr(0)+Attr(2)    ! x position moved one button width right
  64. 640   !
  65. 650   ASSIGN @Box12 TO WIDGET "PUSHBUTTON";SET (Attr_n$(*):Attr(*),Attr_s$(*):Attr_sv$(*))
  66. 660   Attr(0)=Attr(0)+Attr(2)    ! x position moved one button width right
  67. 670   !
  68. 680   ASSIGN @Box13 TO WIDGET "PUSHBUTTON";SET (Attr_n$(*):Attr(*),Attr_s$(*):Attr_sv$(*))
  69. 690   Attr(0)=Attr(0)+Attr(2)
  70. 700   !
  71. 710   ASSIGN @Box14 TO WIDGET "PUSHBUTTON";SET (Attr_n$(*):Attr(*),Attr_s$(*):Attr_sv$(*),"VISIBLE":0)
  72. 720   Attr(0)=Attr(0)-3*Attr(2)  ! x position moved two button widths left
  73. 730   Attr(1)=Attr(1)+Attr(3)    ! y position moved one button height down
  74. 740   !
  75. 750   ASSIGN @Box21 TO WIDGET "PUSHBUTTON";SET (Attr_n$(*):Attr(*),Attr_s$(*):Attr_sv$(*))
  76. 760   Attr(0)=Attr(0)+Attr(2)
  77. 770   !
  78. 780   ASSIGN @Box22 TO WIDGET "PUSHBUTTON";SET (Attr_n$(*):Attr(*),Attr_s$(*):Attr_sv$(*))
  79. 790   Attr(0)=Attr(0)+Attr(2)
  80. 800   !
  81. 810   ASSIGN @Box23 TO WIDGET "PUSHBUTTON";SET (Attr_n$(*):Attr(*),Attr_s$(*):Attr_sv$(*))
  82. 820   Attr(0)=Attr(0)+Attr(2)
  83. 830   !
  84. 840   ASSIGN @Box24 TO WIDGET "PUSHBUTTON";SET (Attr_n$(*):Attr(*),Attr_s$(*):Attr_sv$(*),"VISIBLE":0)
  85. 850   Attr(0)=Attr(0)-3*Attr(2)
  86. 860   Attr(1)=Attr(1)+Attr(3)
  87. 870   !
  88. 880   ASSIGN @Box31 TO WIDGET "PUSHBUTTON";SET (Attr_n$(*):Attr(*),Attr_s$(*):Attr_sv$(*))
  89. 890   Attr(0)=Attr(0)+Attr(2)
  90. 900   !
  91. 910   ASSIGN @Box32 TO WIDGET "PUSHBUTTON";SET (Attr_n$(*):Attr(*),Attr_s$(*):Attr_sv$(*))
  92. 920   Attr(0)=Attr(0)+Attr(2)
  93. 930   !
  94. 940   ASSIGN @Box33 TO WIDGET "PUSHBUTTON";SET (Attr_n$(*):Attr(*),Attr_s$(*):Attr_sv$(*))
  95. 950   Attr(0)=Attr(0)+Attr(2)
  96. 960   !
  97. 970   ASSIGN @Box34 TO WIDGET "PUSHBUTTON";SET (Attr_n$(*):Attr(*),Attr_s$(*):Attr_sv$(*),"VISIBLE":0)
  98. 980   Attr(0)=Attr(0)-3*Attr(2)
  99. 990   Attr(1)=Attr(1)+Attr(3)
  100. 1000  !
  101. 1010  ASSIGN @Box41 TO WIDGET "PUSHBUTTON";SET (Attr_n$(*):Attr(*),Attr_s$(*):Attr_sv$(*),"VISIBLE":0)
  102. 1020  Attr(0)=Attr(0)+Attr(2)
  103. 1030  !
  104. 1040  ASSIGN @Box42 TO WIDGET "PUSHBUTTON";SET (Attr_n$(*):Attr(*),Attr_s$(*):Attr_sv$(*),"VISIBLE":0)
  105. 1050  Attr(0)=Attr(0)+Attr(2)
  106. 1060  !
  107. 1070  ASSIGN @Box43 TO WIDGET "PUSHBUTTON";SET (Attr_n$(*):Attr(*),Attr_s$(*):Attr_sv$(*),"VISIBLE":0)
  108. 1080  Attr(0)=Attr(0)+Attr(2)
  109. 1090  !
  110. 1100  ASSIGN @Box44 TO WIDGET "PUSHBUTTON";SET (Attr_n$(*):Attr(*),Attr_s$(*):Attr_sv$(*),"VISIBLE":0)
  111. 1110  IF Dims=4 THEN
  112. 1120    CONTROL @Box44;SET ("VISIBLE":1)
  113. 1130    CONTROL @Box43;SET ("VISIBLE":1)
  114. 1140    CONTROL @Box42;SET ("VISIBLE":1)
  115. 1150    CONTROL @Box41;SET ("VISIBLE":1)
  116. 1160    CONTROL @Box34;SET ("VISIBLE":1)
  117. 1170    CONTROL @Box24;SET ("VISIBLE":1)
  118. 1180    CONTROL @Box14;SET ("VISIBLE":1)
  119. 1190  END IF
  120. 1200  ASSIGN @Quit TO WIDGET "PUSHBUTTON"
  121. 1210  CONTROL @Quit;SET ("TITLE":"","LABEL":"Quit","X":10,"Y":22)
  122. 1220  CONTROL @Quit;SET ("HEIGHT":40,"WIDTH":60)
  123. 1230  ON EVENT @Quit,"ACTIVATED" GOTO Finis
  124. 1240  !
  125. 1250  ! The Turn variable keeps track of whose
  126. 1260  ! turn it is. Zero means X, one means O.
  127. 1270  !
  128. 1280  Turn=0
  129. 1290  Xo$(0)="X"
  130. 1300  Xo$(1)="O"
  131. 1310  !
  132. 1320  ! A STRING widget to remind the players whose turn it is
  133. 1330  !
  134. 1340  Attr(0)=Attr(0)-3*Attr(2)    ! Move x position back to left edge
  135. 1350  IF Dims=4 THEN Attr(1)=Attr(1)+Attr(3)  ! Move y position to bottom
  136. 1360  Attr(2)=Dims*Attr(2)         ! Set width to three buttons wide
  137. 1370  !
  138. 1380  ASSIGN @Who TO WIDGET "STRING";SET (Attr_n$(*):Attr(*),"TITLE":"","VALUE":"It is "&Xo$(Turn)&"'s turn")
  139. 1390  !
  140. 1400  ! This array records who has which square. It is initialized to values
  141. 1410  ! which are unequal and do not correspond to either an X or an O.
  142. 1420  !
  143. 1430 Start: !
  144. 1440  FOR I=0 TO Dims-1
  145. 1450    FOR J=0 TO Dims-1
  146. 1460      Xo(I,J)=-1-I-2*J
  147. 1470    NEXT J
  148. 1480  NEXT I
  149. 1490  !
  150. 1500  ! Each pushbotton calls its own subroutine.
  151. 1510  !
  152. 1520  ON EVENT @Box11,"ACTIVATED" GOSUB Hit_box11
  153. 1530  ON EVENT @Box12,"ACTIVATED" GOSUB Hit_box12
  154. 1540  ON EVENT @Box13,"ACTIVATED" GOSUB Hit_box13
  155. 1550  ON EVENT @Box14,"ACTIVATED" GOSUB Hit_box14
  156. 1560  ON EVENT @Box21,"ACTIVATED" GOSUB Hit_box21
  157. 1570  ON EVENT @Box22,"ACTIVATED" GOSUB Hit_box22
  158. 1580  ON EVENT @Box23,"ACTIVATED" GOSUB Hit_box23
  159. 1590  ON EVENT @Box24,"ACTIVATED" GOSUB Hit_box24
  160. 1600  ON EVENT @Box31,"ACTIVATED" GOSUB Hit_box31
  161. 1610  ON EVENT @Box32,"ACTIVATED" GOSUB Hit_box32
  162. 1620  ON EVENT @Box33,"ACTIVATED" GOSUB Hit_box33
  163. 1630  ON EVENT @Box34,"ACTIVATED" GOSUB Hit_box34
  164. 1640  ON EVENT @Box41,"ACTIVATED" GOSUB Hit_box41
  165. 1650  ON EVENT @Box42,"ACTIVATED" GOSUB Hit_box42
  166. 1660  ON EVENT @Box43,"ACTIVATED" GOSUB Hit_box43
  167. 1670  ON EVENT @Box44,"ACTIVATED" GOSUB Hit_box44
  168. 1680  LOOP
  169. 1690    CONTROL @Who;SET ("VALUE":"It is "&Xo$(Turn)&"'s turn")
  170. 1700    IF Turn=0 OR Players=2 THEN
  171. 1710      WAIT FOR EVENT
  172. 1720    ELSE
  173. 1730      Computer_play(Xo(*),Turn,Level,Row,Col,Dims)
  174. 1740      Set_box(Xo$(Turn),Row,Col,@Box11,@Box12,@Box13,@Box14,@Box21,@Box22,@Box23,@Box24,@Box31,@Box32,@Box33,@Box34,@Box41,@Box42,@Box43,@Box44)
  175. 1750      Xo(Row,Col)=Turn
  176. 1760      Turn=(Turn=0)
  177. 1770    END IF
  178. 1780  !
  179. 1790  ! These IF statements check if anyone has three in a row
  180. 1800  !
  181. 1810    Winner=-1
  182. 1820    Winner=FNCheck_winner(Xo(*),Dims)
  183. 1830    IF Winner>=0 THEN GOTO Win
  184. 1840  !
  185. 1850  ! Check to see if all the squares have been taken
  186. 1860  !
  187. 1870    Tie=FNCheck_tie(Xo(*),Dims)
  188. 1880    IF Tie THEN GOTO Tie
  189. 1890  END LOOP
  190. 1900  !
  191. 1910  ! Each square has its own subroutine. They are nearly identical.
  192. 1920  ! The appropriate square is given to the player whose turn it is.
  193. 1930  ! An X or O is in placed in the square. The pushbutton for that
  194. 1940  ! square is deactivated. The turn indicator is flipped.
  195. 1950  !
  196. 1960 Hit_box11: !
  197. 1970  Xo(0,0)=Turn
  198. 1980  CONTROL @Box11;SET ("LABEL":Xo$(Turn))
  199. 1990  Turn=(Turn=0)
  200. 2000  OFF EVENT @Box11,"ACTIVATED"
  201. 2010  RETURN
  202. 2020  !
  203. 2030 Hit_box12: !
  204. 2040  Xo(0,1)=Turn
  205. 2050  CONTROL @Box12;SET ("LABEL":Xo$(Turn))
  206. 2060  Turn=(Turn=0)
  207. 2070  OFF EVENT @Box12,"ACTIVATED"
  208. 2080  RETURN
  209. 2090  !
  210. 2100 Hit_box13: !
  211. 2110  Xo(0,2)=Turn
  212. 2120  CONTROL @Box13;SET ("LABEL":Xo$(Turn))
  213. 2130  Turn=(Turn=0)
  214. 2140  OFF EVENT @Box13,"ACTIVATED"
  215. 2150  RETURN
  216. 2160  !
  217. 2170 Hit_box14: !
  218. 2180  Xo(0,3)=Turn
  219. 2190  CONTROL @Box14;SET ("LABEL":Xo$(Turn))
  220. 2200  Turn=(Turn=0)
  221. 2210  OFF EVENT @Box14,"ACTIVATED"
  222. 2220  RETURN
  223. 2230  !
  224. 2240 Hit_box21: !
  225. 2250  CONTROL @Box21;SET ("LABEL":Xo$(Turn))
  226. 2260  Xo(1,0)=Turn
  227. 2270  Turn=(Turn=0)
  228. 2280  OFF EVENT @Box21,"ACTIVATED"
  229. 2290  RETURN
  230. 2300  !
  231. 2310 Hit_box22: !
  232. 2320  Xo(1,1)=Turn
  233. 2330  CONTROL @Box22;SET ("LABEL":Xo$(Turn))
  234. 2340  Turn=(Turn=0)
  235. 2350  OFF EVENT @Box22,"ACTIVATED"
  236. 2360  RETURN
  237. 2370  !
  238. 2380 Hit_box23: !
  239. 2390  Xo(1,2)=Turn
  240. 2400  CONTROL @Box23;SET ("LABEL":Xo$(Turn))
  241. 2410  Turn=(Turn=0)
  242. 2420  OFF EVENT @Box23,"ACTIVATED"
  243. 2430  RETURN
  244. 2440  !
  245. 2450 Hit_box24: !
  246. 2460  Xo(1,3)=Turn
  247. 2470  CONTROL @Box24;SET ("LABEL":Xo$(Turn))
  248. 2480  Turn=(Turn=0)
  249. 2490  OFF EVENT @Box24,"ACTIVATED"
  250. 2500  RETURN
  251. 2510  !
  252. 2520 Hit_box31: !
  253. 2530  Xo(2,0)=Turn
  254. 2540  CONTROL @Box31;SET ("LABEL":Xo$(Turn))
  255. 2550  Turn=(Turn=0)
  256. 2560  OFF EVENT @Box31,"ACTIVATED"
  257. 2570  RETURN
  258. 2580  !
  259. 2590 Hit_box32: !
  260. 2600  Xo(2,1)=Turn
  261. 2610  CONTROL @Box32;SET ("LABEL":Xo$(Turn))
  262. 2620  Turn=(Turn=0)
  263. 2630  OFF EVENT @Box32,"ACTIVATED"
  264. 2640  RETURN
  265. 2650  !
  266. 2660 Hit_box33: !
  267. 2670  Xo(2,2)=Turn
  268. 2680  CONTROL @Box33;SET ("LABEL":Xo$(Turn))
  269. 2690  Turn=(Turn=0)
  270. 2700  OFF EVENT @Box33,"ACTIVATED"
  271. 2710  RETURN
  272. 2720  !
  273. 2730 Hit_box34: !
  274. 2740  Xo(2,3)=Turn
  275. 2750  CONTROL @Box34;SET ("LABEL":Xo$(Turn))
  276. 2760  Turn=(Turn=0)
  277. 2770  OFF EVENT @Box34,"ACTIVATED"
  278. 2780  RETURN
  279. 2790  !
  280. 2800 Hit_box41: !
  281. 2810  Xo(3,0)=Turn
  282. 2820  CONTROL @Box41;SET ("LABEL":Xo$(Turn))
  283. 2830  Turn=(Turn=0)
  284. 2840  OFF EVENT @Box41,"ACTIVATED"
  285. 2850  RETURN
  286. 2860  !
  287. 2870 Hit_box42: !
  288. 2880  Xo(3,1)=Turn
  289. 2890  CONTROL @Box42;SET ("LABEL":Xo$(Turn))
  290. 2900  Turn=(Turn=0)
  291. 2910  OFF EVENT @Box42,"ACTIVATED"
  292. 2920  RETURN
  293. 2930  !
  294. 2940 Hit_box43: !
  295. 2950  Xo(3,2)=Turn
  296. 2960  CONTROL @Box43;SET ("LABEL":Xo$(Turn))
  297. 2970  Turn=(Turn=0)
  298. 2980  OFF EVENT @Box43,"ACTIVATED"
  299. 2990  RETURN
  300. 3000  !
  301. 3010 Hit_box44: !
  302. 3020  Xo(3,3)=Turn
  303. 3030  CONTROL @Box44;SET ("LABEL":Xo$(Turn))
  304. 3040  Turn=(Turn=0)
  305. 3050  OFF EVENT @Box44,"ACTIVATED"
  306. 3060  RETURN
  307. 3070 Win: !
  308. 3080  !
  309. 3090  ! Announce the winner
  310. 3100  !
  311. 3110  DIALOG "INFORMATION",Xo$(Winner)&" wins";SET ("X":50,"Y":0,"WIDTH":300,"HEIGHT":300,"FONT":"20 BY 30")
  312. 3120  GOTO Cleanup
  313. 3130 Tie:!
  314. 3140  !
  315. 3150  ! Declare a tie
  316. 3160  !
  317. 3170  DIALOG "INFORMATION","Tie";SET ("X":50,"Y":0,"WIDTH":300,"HEIGHT":300,"FONT":"20 BY 30")
  318. 3180  !
  319. 3190  ! Make the labels in all the squares blank
  320. 3200  !
  321. 3210 Cleanup: !
  322. 3220  CONTROL @Box11;SET ("LABEL":"")
  323. 3230  CONTROL @Box12;SET ("LABEL":"")
  324. 3240  CONTROL @Box13;SET ("LABEL":"")
  325. 3250  CONTROL @Box14;SET ("LABEL":"")
  326. 3260  CONTROL @Box21;SET ("LABEL":"")
  327. 3270  CONTROL @Box22;SET ("LABEL":"")
  328. 3280  CONTROL @Box23;SET ("LABEL":"")
  329. 3290  CONTROL @Box24;SET ("LABEL":"")
  330. 3300  CONTROL @Box31;SET ("LABEL":"")
  331. 3310  CONTROL @Box32;SET ("LABEL":"")
  332. 3320  CONTROL @Box33;SET ("LABEL":"")
  333. 3330  CONTROL @Box34;SET ("LABEL":"")
  334. 3340  CONTROL @Box41;SET ("LABEL":"")
  335. 3350  CONTROL @Box42;SET ("LABEL":"")
  336. 3360  CONTROL @Box43;SET ("LABEL":"")
  337. 3370  CONTROL @Box44;SET ("LABEL":"")
  338. 3380  !
  339. 3390  ! Give the turn indicator to X and start a new game
  340. 3400  !
  341. 3410  Turn=0
  342. 3420  GOTO Start
  343. 3430 Finis: END
  344. 3440  DEF FNCheck_winner(Xo(*),Dims)
  345. 3450    Winner=-1
  346. 3460    Fail=0
  347. 3470  !
  348. 3480  ! Check Rows
  349. 3490  !
  350. 3500    FOR I=0 TO Dims-1
  351. 3510      FOR J=0 TO Dims-2
  352. 3520        IF Xo(I,J+1)<>Xo(I,J) THEN
  353. 3530          Fail=1
  354. 3540          GOTO 3590
  355. 3550        END IF
  356. 3560        Tmp=Xo(I,J)
  357. 3570      NEXT J
  358. 3580      IF Fail=0 THEN RETURN Tmp
  359. 3590      Fail=0
  360. 3600    NEXT I
  361. 3610  !
  362. 3620  ! Check Columns
  363. 3630  !
  364. 3640    Fail=0
  365. 3650    FOR J=0 TO Dims-1
  366. 3660      FOR I=0 TO Dims-2
  367. 3670        IF Xo(I+1,J)<>Xo(I,J) THEN
  368. 3680          Fail=1
  369. 3690          GOTO 3740
  370. 3700        END IF
  371. 3710        Tmp=Xo(I,J)
  372. 3720      NEXT I
  373. 3730      IF Fail=0 THEN RETURN Tmp
  374. 3740      Fail=0
  375. 3750    NEXT J
  376. 3760  !
  377. 3770  ! Check Diagonals
  378. 3780  !
  379. 3790    Tmp=Xo(0,0)
  380. 3800    Fail=0
  381. 3810    FOR J=0 TO Dims-2
  382. 3820      IF Xo(J,J)<>Xo(J+1,J+1) THEN
  383. 3830        Fail=1
  384. 3840        GOTO 3880
  385. 3850      END IF
  386. 3860    NEXT J
  387. 3870    IF Fail=0 THEN RETURN Tmp
  388. 3880    Tmp=Xo(Dims-1,0)
  389. 3890    Fail=0
  390. 3900    FOR J=0 TO Dims-2
  391. 3910      IF Xo(Dims-1-J,J)<>Xo(Dims-2-J,J+1) THEN
  392. 3920        Fail=1
  393. 3930        RETURN -1
  394. 3940      END IF
  395. 3950    NEXT J
  396. 3960    IF Fail=0 THEN RETURN Tmp
  397. 3970    RETURN -1
  398. 3980  FNEND
  399. 3990  DEF FNCheck_tie(Xo(*),Dims)
  400. 4000    Tie=1
  401. 4010    FOR I=0 TO Dims-1
  402. 4020      FOR J=0 TO Dims-1
  403. 4030        IF Xo(I,J)<0 THEN Tie=0
  404. 4040      NEXT J
  405. 4050    NEXT I
  406. 4060    RETURN Tie
  407. 4070  FNEND
  408. 4080  SUB Computer_play(Xo(*),Turn,Level,Row,Col,Dims)
  409. 4090 Computer_play: !
  410. 4100    DIM Weights(3,3)
  411. 4110    REDIM Weights(Dims-1,Dims-1)
  412. 4120    Opponent=(Turn+1) MOD 2
  413. 4130    MAT Weights=(0)
  414. 4140    IF Level>1 THEN ASSIGN @W TO WIDGET "LABEL";SET ("VALUE":"I'm calculating. Please Wait...","COLUMNS":35,"ROWS":2)
  415. 4150    Find_weights(Xo(*),Weights(*),Turn,Turn,Level,Dims)
  416. 4160    Eval_weights(Xo(*),Weights(*),Row,Col,Dims)
  417. 4170    IF Level>1 THEN ASSIGN @W TO *
  418. 4180  SUBEND
  419. 4190  SUB Find_weights(X(*),Weights(*),Mark,Turn,Level,Dims)
  420. 4200 Find_weights: !
  421. 4210    DIM X1(3,3)
  422. 4220    REDIM X1(Dims-1,Dims-1)
  423. 4230    MAT X1=X
  424. 4240    REAL Temp
  425. 4250    Opponent=(Turn+1) MOD 2
  426. 4260    Opp_mark=(Mark+1) MOD 2
  427. 4270    FOR I=0 TO Dims-1
  428. 4280      FOR J=0 TO Dims-1
  429. 4290        IF X1(I,J)<0 THEN
  430. 4300          Temp=X1(I,J)
  431. 4310          X1(I,J)=Turn
  432. 4320          M=FNCheck_winner(X1(*),Dims)
  433. 4330          IF M=Mark THEN
  434. 4340            Weights(I,J)=Weights(I,J)+1
  435. 4350          ELSE
  436. 4360            IF M=Opp_mark THEN
  437. 4370              Weights(I,J)=Weights(I,J)+1
  438. 4380            ELSE
  439. 4390              IF Level>0 THEN CALL Find_weights(X1(*),Weights(*),Mark,Opponent,Level-1,Dims)
  440. 4400            END IF
  441. 4410          END IF
  442. 4420          X1(I,J)=Temp
  443. 4430        END IF
  444. 4440      NEXT J
  445. 4450    NEXT I
  446. 4460  SUBEND
  447. 4470  SUB Eval_weights(X(*),W(*),R,C,Dims)
  448. 4480    DIM Opt_rows(16),Opt_cols(16)
  449. 4490    Best=MAX(W(*))
  450. 4500    Count=0
  451. 4510    FOR I=0 TO Dims-1
  452. 4520      FOR J=0 TO Dims-1
  453. 4530        IF W(I,J)=Best AND X(I,J)<0 THEN
  454. 4540          Opt_rows(Count)=I
  455. 4550          Opt_cols(Count)=J
  456. 4560          Count=Count+1
  457. 4570        END IF
  458. 4580      NEXT J
  459. 4590    NEXT I
  460. 4600    Index=MAX(0,PROUND(Count*RND-.5,0))
  461. 4610    R=Opt_rows(Index)
  462. 4620    C=Opt_cols(Index)
  463. 4630  SUBEND
  464. 4640  SUB Set_box(X$,Row,Col,@B11,@B12,@B13,@B14,@B21,@B22,@B23,@B24,@B31,@B32,@B33,@B34,@B41,@B42,@B43,@B44)
  465. 4650    SELECT 10*Row+Col
  466. 4660    CASE 0
  467. 4670      CONTROL @B11;SET ("LABEL":X$)
  468. 4680    CASE 1
  469. 4690      CONTROL @B12;SET ("LABEL":X$)
  470. 4700    CASE 2
  471. 4710      CONTROL @B13;SET ("LABEL":X$)
  472. 4720    CASE 3
  473. 4730      CONTROL @B14;SET ("LABEL":X$)
  474. 4740    CASE 10
  475. 4750      CONTROL @B21;SET ("LABEL":X$)
  476. 4760    CASE 11
  477. 4770      CONTROL @B22;SET ("LABEL":X$)
  478. 4780    CASE 12
  479. 4790      CONTROL @B23;SET ("LABEL":X$)
  480. 4800    CASE 13
  481. 4810      CONTROL @B24;SET ("LABEL":X$)
  482. 4820    CASE 20
  483. 4830      CONTROL @B31;SET ("LABEL":X$)
  484. 4840    CASE 21
  485. 4850      CONTROL @B32;SET ("LABEL":X$)
  486. 4860    CASE 22
  487. 4870      CONTROL @B33;SET ("LABEL":X$)
  488. 4880    CASE 23
  489. 4890      CONTROL @B34;SET ("LABEL":X$)
  490. 4900    CASE 30
  491. 4910      CONTROL @B41;SET ("LABEL":X$)
  492. 4920    CASE 31
  493. 4930      CONTROL @B42;SET ("LABEL":X$)
  494. 4940    CASE 32
  495. 4950      CONTROL @B43;SET ("LABEL":X$)
  496. 4960    CASE 33
  497. 4970      CONTROL @B44;SET ("LABEL":X$)
  498. 4980    END SELECT
  499. 4990  SUBEND
  500.